{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f0bcab4c",
   "metadata": {},
   "source": [
    "# 期末综合实验任务"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af495ee0",
   "metadata": {},
   "source": [
    "# 给定以下数据集：\n",
    "数据挖掘-汇总-数据表.xlsx\n",
    "数据挖掘成绩.xlsx\n",
    "阅读分析其构成特征，自行设计一个对以上数据集进行分析和挖掘的实验方案（对数据进行预处理/关联/分类/聚类），并利用Python实现你的实验方案。\n",
    "\n",
    "要求：\n",
    "（1）\t实验方案目标明确，步骤清楚，详细可行。\n",
    "（2）\t根据设计步骤完成实验内容，有运行结果截图。\n",
    "（3）\t对方案设计和实现中遇到的问题能进行分析。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ef47482",
   "metadata": {},
   "source": [
    "## 预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "87f65167",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入库\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from efficient_apriori import apriori"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "0434f23a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>总分(满分20.0分)</th>\n",
       "      <th>签到次数（开课13次）</th>\n",
       "      <th>到课率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>38%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10</td>\n",
       "      <td>9</td>\n",
       "      <td>69%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>46%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>15</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>11</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>16</td>\n",
       "      <td>10</td>\n",
       "      <td>77%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>16</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>14</td>\n",
       "      <td>8</td>\n",
       "      <td>62%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>18</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>17</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>20</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>18</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>12</td>\n",
       "      <td>9</td>\n",
       "      <td>69%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>12</td>\n",
       "      <td>6</td>\n",
       "      <td>46%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>13</td>\n",
       "      <td>9</td>\n",
       "      <td>69%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>17</td>\n",
       "      <td>8</td>\n",
       "      <td>62%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>14</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>17</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>13</td>\n",
       "      <td>5</td>\n",
       "      <td>38%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>11</td>\n",
       "      <td>10</td>\n",
       "      <td>77%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>15</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>14</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>16</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>31%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>14</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>15</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>11</td>\n",
       "      <td>5</td>\n",
       "      <td>38%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>77%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>12</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>14</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>16</td>\n",
       "      <td>8</td>\n",
       "      <td>62%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>11</td>\n",
       "      <td>9</td>\n",
       "      <td>69%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>15</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>17</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>18</td>\n",
       "      <td>10</td>\n",
       "      <td>77%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>12</td>\n",
       "      <td>10</td>\n",
       "      <td>77%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>15</td>\n",
       "      <td>12</td>\n",
       "      <td>92%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>13</td>\n",
       "      <td>9</td>\n",
       "      <td>69%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>15</td>\n",
       "      <td>11</td>\n",
       "      <td>85%</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    总分(满分20.0分)  签到次数（开课13次）  到课率\n",
       "0             6            5  38%\n",
       "1            16           12  92%\n",
       "2            13           12  92%\n",
       "3            15           11  85%\n",
       "4            10            9  69%\n",
       "5            13            6  46%\n",
       "6            15           11  85%\n",
       "7            11           12  92%\n",
       "8            16           10  77%\n",
       "9            16           12  92%\n",
       "10           13           12  92%\n",
       "11           16           11  85%\n",
       "12           14            8  62%\n",
       "13           18           11  85%\n",
       "14           17           12  92%\n",
       "15           16           12  92%\n",
       "16           16           12  92%\n",
       "17           20           12  92%\n",
       "18           18           12  92%\n",
       "19           12            9  69%\n",
       "20           12            6  46%\n",
       "21           16           12  92%\n",
       "22           13           11  85%\n",
       "23           10           12  92%\n",
       "24           13            9  69%\n",
       "25           17            8  62%\n",
       "26           14           11  85%\n",
       "27           17           12  92%\n",
       "28           13            5  38%\n",
       "29           11           10  77%\n",
       "30           15           12  92%\n",
       "31           14           12  92%\n",
       "32           16           11  85%\n",
       "33           13           12  92%\n",
       "34            5            4  31%\n",
       "35           14           11  85%\n",
       "36           13           12  92%\n",
       "37           13           12  92%\n",
       "38           16           12  92%\n",
       "39           15           12  92%\n",
       "40           11            5  38%\n",
       "41           10           10  77%\n",
       "42           12           12  92%\n",
       "43           14           12  92%\n",
       "44           16            8  62%\n",
       "45           11            9  69%\n",
       "46           15           12  92%\n",
       "47           11           11  85%\n",
       "48           17           12  92%\n",
       "49           18           10  77%\n",
       "50           13           11  85%\n",
       "51           12           10  77%\n",
       "52           15           12  92%\n",
       "53           13            9  69%\n",
       "54           15           11  85%"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取文件\n",
    "df = pd.read_excel(r'数据挖掘-汇总-数据表.xlsx',\n",
    "                   usecols=[i for i in range(1,4)],         # 读取9-23列\n",
    "                   skiprows=range(0,1),                     # 不读取0-3行\n",
    "                   nrows=56)                                # 读取前41列\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "a6fc0fc5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>总分(满分20.0分)</th>\n",
       "      <th>签到次数（开课13次）</th>\n",
       "      <th>到课率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>13.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>15.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>11.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>16.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>16.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>14.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>18.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>17.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>20.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>18.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>12.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>12.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>13.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>10.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>13.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>17.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>14.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>17.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>13.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>11.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>15.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>14.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>16.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>14.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>13.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>16.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>15.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>11.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>10.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>12.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>14.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>16.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>15.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>11.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>17.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>18.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>13.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>12.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>15.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>0.92</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>13.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>15.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0.85</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    总分(满分20.0分)  签到次数（开课13次）   到课率\n",
       "0           6.0          5.0  0.38\n",
       "1          16.0         12.0  0.92\n",
       "2          13.0         12.0  0.92\n",
       "3          15.0         11.0  0.85\n",
       "4          10.0          9.0  0.69\n",
       "5          13.0          6.0  0.46\n",
       "6          15.0         11.0  0.85\n",
       "7          11.0         12.0  0.92\n",
       "8          16.0         10.0  0.77\n",
       "9          16.0         12.0  0.92\n",
       "10         13.0         12.0  0.92\n",
       "11         16.0         11.0  0.85\n",
       "12         14.0          8.0  0.62\n",
       "13         18.0         11.0  0.85\n",
       "14         17.0         12.0  0.92\n",
       "15         16.0         12.0  0.92\n",
       "16         16.0         12.0  0.92\n",
       "17         20.0         12.0  0.92\n",
       "18         18.0         12.0  0.92\n",
       "19         12.0          9.0  0.69\n",
       "20         12.0          6.0  0.46\n",
       "21         16.0         12.0  0.92\n",
       "22         13.0         11.0  0.85\n",
       "23         10.0         12.0  0.92\n",
       "24         13.0          9.0  0.69\n",
       "25         17.0          8.0  0.62\n",
       "26         14.0         11.0  0.85\n",
       "27         17.0         12.0  0.92\n",
       "28         13.0          5.0  0.38\n",
       "29         11.0         10.0  0.77\n",
       "30         15.0         12.0  0.92\n",
       "31         14.0         12.0  0.92\n",
       "32         16.0         11.0  0.85\n",
       "33         13.0         12.0  0.92\n",
       "34          5.0          4.0  0.31\n",
       "35         14.0         11.0  0.85\n",
       "36         13.0         12.0  0.92\n",
       "37         13.0         12.0  0.92\n",
       "38         16.0         12.0  0.92\n",
       "39         15.0         12.0  0.92\n",
       "40         11.0          5.0  0.38\n",
       "41         10.0         10.0  0.77\n",
       "42         12.0         12.0  0.92\n",
       "43         14.0         12.0  0.92\n",
       "44         16.0          8.0  0.62\n",
       "45         11.0          9.0  0.69\n",
       "46         15.0         12.0  0.92\n",
       "47         11.0         11.0  0.85\n",
       "48         17.0         12.0  0.92\n",
       "49         18.0         10.0  0.77\n",
       "50         13.0         11.0  0.85\n",
       "51         12.0         10.0  0.77\n",
       "52         15.0         12.0  0.92\n",
       "53         13.0          9.0  0.69\n",
       "54         15.0         11.0  0.85"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预处理（将字符串数据类型改为数值类型）\n",
    "list = [float(i[0:2])/100 for i in df[\"到课率\"]]\n",
    "df[\"到课率\"] = list\n",
    "df[[\"总分(满分20.0分)\",\"签到次数（开课13次）\",\"到课率\"]] = df[[\"总分(满分20.0分)\",\"签到次数（开课13次）\",\"到课率\"]].astype(float)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "ff710ce1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6.  ,  5.  ,  0.38, 16.  , 12.  ,  0.92, 13.  , 12.  ,  0.92,\n",
       "        15.  , 11.  ,  0.85, 10.  ,  9.  ,  0.69, 13.  ,  6.  ,  0.46,\n",
       "        15.  , 11.  ,  0.85, 11.  , 12.  ,  0.92, 16.  , 10.  ,  0.77,\n",
       "        16.  , 12.  ,  0.92, 13.  , 12.  ,  0.92, 16.  , 11.  ,  0.85,\n",
       "        14.  ,  8.  ,  0.62, 18.  , 11.  ,  0.85, 17.  , 12.  ,  0.92,\n",
       "        16.  , 12.  ,  0.92, 16.  , 12.  ,  0.92, 20.  , 12.  ,  0.92,\n",
       "        18.  ],\n",
       "       [12.  ,  0.92, 12.  ,  9.  ,  0.69, 12.  ,  6.  ,  0.46, 16.  ,\n",
       "        12.  ,  0.92, 13.  , 11.  ,  0.85, 10.  , 12.  ,  0.92, 13.  ,\n",
       "         9.  ,  0.69, 17.  ,  8.  ,  0.62, 14.  , 11.  ,  0.85, 17.  ,\n",
       "        12.  ,  0.92, 13.  ,  5.  ,  0.38, 11.  , 10.  ,  0.77, 15.  ,\n",
       "        12.  ,  0.92, 14.  , 12.  ,  0.92, 16.  , 11.  ,  0.85, 13.  ,\n",
       "        12.  ,  0.92,  5.  ,  4.  ,  0.31, 14.  , 11.  ,  0.85, 13.  ,\n",
       "        12.  ],\n",
       "       [ 0.92, 13.  , 12.  ,  0.92, 16.  , 12.  ,  0.92, 15.  , 12.  ,\n",
       "         0.92, 11.  ,  5.  ,  0.38, 10.  , 10.  ,  0.77, 12.  , 12.  ,\n",
       "         0.92, 14.  , 12.  ,  0.92, 16.  ,  8.  ,  0.62, 11.  ,  9.  ,\n",
       "         0.69, 15.  , 12.  ,  0.92, 11.  , 11.  ,  0.85, 17.  , 12.  ,\n",
       "         0.92, 18.  , 10.  ,  0.77, 13.  , 11.  ,  0.85, 12.  , 10.  ,\n",
       "         0.77, 15.  , 12.  ,  0.92, 13.  ,  9.  ,  0.69, 15.  , 11.  ,\n",
       "         0.85]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 等深分箱（分3箱）\n",
    "data_box = df.values.reshape([3,-1])\n",
    "data_box"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "43426265",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8.79272727, 8.79272727, 8.79272727, 8.05018182, 8.05018182,\n",
       "       8.05018182, 8.22763636, 8.22763636, 8.22763636])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ⽤箱均值光滑\n",
    "np.repeat(data_box.mean(axis=1), 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "38d1372f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最⼤最⼩规范化(min-max scaled)\n",
    "from sklearn import preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "9f45d731",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.06666667, 0.125     , 0.1147541 ],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [0.53333333, 1.        , 1.        ],\n",
       "       [0.66666667, 0.875     , 0.8852459 ],\n",
       "       [0.33333333, 0.625     , 0.62295082],\n",
       "       [0.53333333, 0.25      , 0.24590164],\n",
       "       [0.66666667, 0.875     , 0.8852459 ],\n",
       "       [0.4       , 1.        , 1.        ],\n",
       "       [0.73333333, 0.75      , 0.75409836],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [0.53333333, 1.        , 1.        ],\n",
       "       [0.73333333, 0.875     , 0.8852459 ],\n",
       "       [0.6       , 0.5       , 0.50819672],\n",
       "       [0.86666667, 0.875     , 0.8852459 ],\n",
       "       [0.8       , 1.        , 1.        ],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [1.        , 1.        , 1.        ],\n",
       "       [0.86666667, 1.        , 1.        ],\n",
       "       [0.46666667, 0.625     , 0.62295082],\n",
       "       [0.46666667, 0.25      , 0.24590164],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [0.53333333, 0.875     , 0.8852459 ],\n",
       "       [0.33333333, 1.        , 1.        ],\n",
       "       [0.53333333, 0.625     , 0.62295082],\n",
       "       [0.8       , 0.5       , 0.50819672],\n",
       "       [0.6       , 0.875     , 0.8852459 ],\n",
       "       [0.8       , 1.        , 1.        ],\n",
       "       [0.53333333, 0.125     , 0.1147541 ],\n",
       "       [0.4       , 0.75      , 0.75409836],\n",
       "       [0.66666667, 1.        , 1.        ],\n",
       "       [0.6       , 1.        , 1.        ],\n",
       "       [0.73333333, 0.875     , 0.8852459 ],\n",
       "       [0.53333333, 1.        , 1.        ],\n",
       "       [0.        , 0.        , 0.        ],\n",
       "       [0.6       , 0.875     , 0.8852459 ],\n",
       "       [0.53333333, 1.        , 1.        ],\n",
       "       [0.53333333, 1.        , 1.        ],\n",
       "       [0.73333333, 1.        , 1.        ],\n",
       "       [0.66666667, 1.        , 1.        ],\n",
       "       [0.4       , 0.125     , 0.1147541 ],\n",
       "       [0.33333333, 0.75      , 0.75409836],\n",
       "       [0.46666667, 1.        , 1.        ],\n",
       "       [0.6       , 1.        , 1.        ],\n",
       "       [0.73333333, 0.5       , 0.50819672],\n",
       "       [0.4       , 0.625     , 0.62295082],\n",
       "       [0.66666667, 1.        , 1.        ],\n",
       "       [0.4       , 0.875     , 0.8852459 ],\n",
       "       [0.8       , 1.        , 1.        ],\n",
       "       [0.86666667, 0.75      , 0.75409836],\n",
       "       [0.53333333, 0.875     , 0.8852459 ],\n",
       "       [0.46666667, 0.75      , 0.75409836],\n",
       "       [0.66666667, 1.        , 1.        ],\n",
       "       [0.53333333, 0.625     , 0.62295082],\n",
       "       [0.66666667, 0.875     , 0.8852459 ]])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = df.values\n",
    "min_max_scaler = preprocessing.MinMaxScaler()\n",
    "X_train_minmax = min_max_scaler.fit_transform(X_train)\n",
    "X_train_minmax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "690dc549",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Z-score 规范化（零均值规范化）\n",
    "#通过z-socre规范化，将数值的均值转换成0， ⽅差转换成1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "9d74cabb",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2.81770662, -2.46120339, -2.48892317],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [-0.31812817,  0.74002399,  0.72783132],\n",
       "       [ 0.39603711,  0.28270579,  0.31084463],\n",
       "       [-1.38937607, -0.6319306 , -0.64226782],\n",
       "       [-0.31812817, -2.00388519, -2.01236695],\n",
       "       [ 0.39603711,  0.28270579,  0.31084463],\n",
       "       [-1.03229344,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974, -0.1746124 , -0.1657116 ],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [-0.31812817,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974,  0.28270579,  0.31084463],\n",
       "       [ 0.03895447, -1.0892488 , -1.05925451],\n",
       "       [ 1.46728501,  0.28270579,  0.31084463],\n",
       "       [ 1.11020238,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [ 2.18145028,  0.74002399,  0.72783132],\n",
       "       [ 1.46728501,  0.74002399,  0.72783132],\n",
       "       [-0.6752108 , -0.6319306 , -0.64226782],\n",
       "       [-0.6752108 , -2.00388519, -2.01236695],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [-0.31812817,  0.28270579,  0.31084463],\n",
       "       [-1.38937607,  0.74002399,  0.72783132],\n",
       "       [-0.31812817, -0.6319306 , -0.64226782],\n",
       "       [ 1.11020238, -1.0892488 , -1.05925451],\n",
       "       [ 0.03895447,  0.28270579,  0.31084463],\n",
       "       [ 1.11020238,  0.74002399,  0.72783132],\n",
       "       [-0.31812817, -2.46120339, -2.48892317],\n",
       "       [-1.03229344, -0.1746124 , -0.1657116 ],\n",
       "       [ 0.39603711,  0.74002399,  0.72783132],\n",
       "       [ 0.03895447,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974,  0.28270579,  0.31084463],\n",
       "       [-0.31812817,  0.74002399,  0.72783132],\n",
       "       [-3.17478925, -2.91852159, -2.90590987],\n",
       "       [ 0.03895447,  0.28270579,  0.31084463],\n",
       "       [-0.31812817,  0.74002399,  0.72783132],\n",
       "       [-0.31812817,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974,  0.74002399,  0.72783132],\n",
       "       [ 0.39603711,  0.74002399,  0.72783132],\n",
       "       [-1.03229344, -2.46120339, -2.48892317],\n",
       "       [-1.38937607, -0.1746124 , -0.1657116 ],\n",
       "       [-0.6752108 ,  0.74002399,  0.72783132],\n",
       "       [ 0.03895447,  0.74002399,  0.72783132],\n",
       "       [ 0.75311974, -1.0892488 , -1.05925451],\n",
       "       [-1.03229344, -0.6319306 , -0.64226782],\n",
       "       [ 0.39603711,  0.74002399,  0.72783132],\n",
       "       [-1.03229344,  0.28270579,  0.31084463],\n",
       "       [ 1.11020238,  0.74002399,  0.72783132],\n",
       "       [ 1.46728501, -0.1746124 , -0.1657116 ],\n",
       "       [-0.31812817,  0.28270579,  0.31084463],\n",
       "       [-0.6752108 , -0.1746124 , -0.1657116 ],\n",
       "       [ 0.39603711,  0.74002399,  0.72783132],\n",
       "       [-0.31812817, -0.6319306 , -0.64226782],\n",
       "       [ 0.39603711,  0.28270579,  0.31084463]])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled = preprocessing.scale(X_train)\n",
    "X_scaled"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "eca8732f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.312081756375185e-16"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "90316fa6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0000000000000002"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_scaled.var()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4f2d515",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ⼩数定标\n",
    "# 通过移动属性 的⼩数点位置来进⾏规范化:\n",
    "# 其中 是使得 的最⼩整数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "f4ed8bf2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.6  , 0.5  , 0.038],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [1.3  , 1.2  , 0.092],\n",
       "       [1.5  , 1.1  , 0.085],\n",
       "       [1.   , 0.9  , 0.069],\n",
       "       [1.3  , 0.6  , 0.046],\n",
       "       [1.5  , 1.1  , 0.085],\n",
       "       [1.1  , 1.2  , 0.092],\n",
       "       [1.6  , 1.   , 0.077],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [1.3  , 1.2  , 0.092],\n",
       "       [1.6  , 1.1  , 0.085],\n",
       "       [1.4  , 0.8  , 0.062],\n",
       "       [1.8  , 1.1  , 0.085],\n",
       "       [1.7  , 1.2  , 0.092],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [2.   , 1.2  , 0.092],\n",
       "       [1.8  , 1.2  , 0.092],\n",
       "       [1.2  , 0.9  , 0.069],\n",
       "       [1.2  , 0.6  , 0.046],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [1.3  , 1.1  , 0.085],\n",
       "       [1.   , 1.2  , 0.092],\n",
       "       [1.3  , 0.9  , 0.069],\n",
       "       [1.7  , 0.8  , 0.062],\n",
       "       [1.4  , 1.1  , 0.085],\n",
       "       [1.7  , 1.2  , 0.092],\n",
       "       [1.3  , 0.5  , 0.038],\n",
       "       [1.1  , 1.   , 0.077],\n",
       "       [1.5  , 1.2  , 0.092],\n",
       "       [1.4  , 1.2  , 0.092],\n",
       "       [1.6  , 1.1  , 0.085],\n",
       "       [1.3  , 1.2  , 0.092],\n",
       "       [0.5  , 0.4  , 0.031],\n",
       "       [1.4  , 1.1  , 0.085],\n",
       "       [1.3  , 1.2  , 0.092],\n",
       "       [1.3  , 1.2  , 0.092],\n",
       "       [1.6  , 1.2  , 0.092],\n",
       "       [1.5  , 1.2  , 0.092],\n",
       "       [1.1  , 0.5  , 0.038],\n",
       "       [1.   , 1.   , 0.077],\n",
       "       [1.2  , 1.2  , 0.092],\n",
       "       [1.4  , 1.2  , 0.092],\n",
       "       [1.6  , 0.8  , 0.062],\n",
       "       [1.1  , 0.9  , 0.069],\n",
       "       [1.5  , 1.2  , 0.092],\n",
       "       [1.1  , 1.1  , 0.085],\n",
       "       [1.7  , 1.2  , 0.092],\n",
       "       [1.8  , 1.   , 0.077],\n",
       "       [1.3  , 1.1  , 0.085],\n",
       "       [1.2  , 1.   , 0.077],\n",
       "       [1.5  , 1.2  , 0.092],\n",
       "       [1.3  , 0.9  , 0.069],\n",
       "       [1.5  , 1.1  , 0.085]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train / 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "9fcdf7d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 展示⽅差解释⼒度\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from matplotlib.font_manager import FontProperties\n",
    "plt.rcParams['font.sans-serif'] = ['simhei']\n",
    "plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "f4900fae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components=3)"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = (df - df.mean()) / df.std()\n",
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components = X.shape[1])\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "8089a5ef",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>⽅差</th>\n",
       "      <th>贡献度</th>\n",
       "      <th>累计贡献度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.398133</td>\n",
       "      <td>0.799378</td>\n",
       "      <td>0.799378</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.601702</td>\n",
       "      <td>0.200567</td>\n",
       "      <td>0.999945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.000165</td>\n",
       "      <td>0.000055</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         ⽅差       贡献度     累计贡献度\n",
       "0  2.398133  0.799378  0.799378\n",
       "1  0.601702  0.200567  0.999945\n",
       "2  0.000165  0.000055  1.000000"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 展示⽅差解释⼒度\n",
    "pd.DataFrame({'⽅差': pca.explained_variance_,\n",
    " '贡献度':pca.explained_variance_ratio_,\n",
    " '累计贡献度':pca.explained_variance_ratio_.cumsum()})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "1b491bfa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '贡献度')"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(3), pca.explained_variance_ratio_)\n",
    "plt.title('贡献度')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2bd33e7b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5fc4fe15",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc6a55c9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5038228f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d48350a9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df427623",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "55699b02",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "49852751",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "b3a5387f",
   "metadata": {},
   "source": [
    "## 关联"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "id": "7938874c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from efficient_apriori import apriori"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "id": "a4be087c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>签到方式</th>\n",
       "      <th>签到方式.1</th>\n",
       "      <th>签到方式.2</th>\n",
       "      <th>签到方式.3</th>\n",
       "      <th>签到方式.4</th>\n",
       "      <th>签到方式.5</th>\n",
       "      <th>签到方式.6</th>\n",
       "      <th>签到方式.7</th>\n",
       "      <th>签到方式.8</th>\n",
       "      <th>签到方式.9</th>\n",
       "      <th>签到方式.10</th>\n",
       "      <th>签到方式.11</th>\n",
       "      <th>签到方式.12</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "      <td>课堂暗号</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>未上课</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>“正在上课”提示</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>未上课</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "      <td>扫二维码</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        签到方式 签到方式.1    签到方式.2 签到方式.3    签到方式.4    签到方式.5    签到方式.6    签到方式.7  \\\n",
       "0       扫二维码    未上课      扫二维码   扫二维码       未上课      扫二维码       未上课       未上课   \n",
       "1       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "2       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "3       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "4        未上课    未上课       未上课    未上课      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "5       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码       未上课       未上课   \n",
       "6       扫二维码    未上课      扫二维码   扫二维码      扫二维码       未上课      扫二维码      扫二维码   \n",
       "7   “正在上课”提示    未上课      课堂暗号   课堂暗号      扫二维码      课堂暗号      课堂暗号      课堂暗号   \n",
       "8       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码       未上课   \n",
       "9       扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "10      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "11      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码       未上课   \n",
       "12      扫二维码    未上课      扫二维码    未上课      扫二维码      扫二维码      扫二维码  “正在上课”提示   \n",
       "13      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "14      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "15      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "16  “正在上课”提示    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "17      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "18      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "19       未上课    未上课       未上课    未上课      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "20      扫二维码    未上课      扫二维码   扫二维码      扫二维码  “正在上课”提示       未上课       未上课   \n",
       "21      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "22      扫二维码    未上课      扫二维码   扫二维码      扫二维码       未上课      扫二维码      扫二维码   \n",
       "23      扫二维码    未上课      扫二维码   扫二维码      扫二维码  “正在上课”提示      扫二维码      扫二维码   \n",
       "24      扫二维码    未上课      扫二维码   扫二维码      扫二维码       未上课      扫二维码      扫二维码   \n",
       "25      扫二维码    未上课      扫二维码   扫二维码  “正在上课”提示      扫二维码       未上课       未上课   \n",
       "26      扫二维码    未上课      扫二维码   扫二维码      扫二维码  “正在上课”提示      扫二维码  “正在上课”提示   \n",
       "27      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "28      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码       未上课       未上课   \n",
       "29      扫二维码    未上课      扫二维码   扫二维码       未上课      扫二维码      扫二维码      扫二维码   \n",
       "30      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码  “正在上课”提示      扫二维码   \n",
       "31      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "32      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "33      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "34      扫二维码    未上课      扫二维码    未上课      扫二维码      扫二维码       未上课       未上课   \n",
       "35      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码  “正在上课”提示   \n",
       "36      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "37      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "38      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "39      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "40      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码       未上课       未上课   \n",
       "41      扫二维码    未上课      扫二维码   扫二维码       未上课      扫二维码       未上课      扫二维码   \n",
       "42      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "43      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "44      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码       未上课       未上课   \n",
       "45      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "46      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "47      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码       未上课   \n",
       "48      扫二维码    未上课  “正在上课”提示   扫二维码  “正在上课”提示      扫二维码      扫二维码      扫二维码   \n",
       "49      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "50      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码  “正在上课”提示   \n",
       "51      扫二维码    未上课      扫二维码   扫二维码  “正在上课”提示      扫二维码      扫二维码      扫二维码   \n",
       "52      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码      扫二维码      扫二维码   \n",
       "53      扫二维码    未上课      扫二维码   扫二维码      扫二维码      扫二维码       未上课      扫二维码   \n",
       "54      扫二维码    未上课      扫二维码   扫二维码  “正在上课”提示      扫二维码       未上课      扫二维码   \n",
       "\n",
       "      签到方式.8    签到方式.9   签到方式.10   签到方式.11   签到方式.12  \n",
       "0        未上课      扫二维码       未上课       未上课       未上课  \n",
       "1       扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "2       扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "3       扫二维码       未上课      扫二维码      扫二维码      扫二维码  \n",
       "4       扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "5        未上课       未上课       未上课      扫二维码       未上课  \n",
       "6       扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "7       课堂暗号      课堂暗号      课堂暗号      课堂暗号      课堂暗号  \n",
       "8       扫二维码      扫二维码       未上课      扫二维码      扫二维码  \n",
       "9       扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "10      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "11      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "12       未上课      扫二维码       未上课  “正在上课”提示       未上课  \n",
       "13       未上课      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "14      扫二维码      扫二维码      扫二维码  “正在上课”提示      扫二维码  \n",
       "15      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "16      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "17      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "18      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "19      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "20       未上课       未上课       未上课  “正在上课”提示       未上课  \n",
       "21      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "22      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "23      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "24       未上课      扫二维码       未上课      扫二维码      扫二维码  \n",
       "25       未上课      扫二维码       未上课      扫二维码      扫二维码  \n",
       "26       未上课      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "27      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "28       未上课       未上课       未上课       未上课       未上课  \n",
       "29      扫二维码      扫二维码      扫二维码      扫二维码       未上课  \n",
       "30      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "31      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "32      扫二维码      扫二维码      扫二维码       未上课      扫二维码  \n",
       "33      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "34       未上课       未上课       未上课       未上课       未上课  \n",
       "35      扫二维码      扫二维码      扫二维码       未上课      扫二维码  \n",
       "36      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "37      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "38      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "39      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "40       未上课       未上课       未上课       未上课       未上课  \n",
       "41      扫二维码      扫二维码  “正在上课”提示      扫二维码  “正在上课”提示  \n",
       "42      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "43      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "44       未上课      扫二维码       未上课      扫二维码      扫二维码  \n",
       "45      扫二维码      扫二维码       未上课       未上课       未上课  \n",
       "46      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "47      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "48  “正在上课”提示      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "49       未上课      扫二维码       未上课      扫二维码      扫二维码  \n",
       "50       未上课  “正在上课”提示      扫二维码      扫二维码      扫二维码  \n",
       "51       未上课       未上课      扫二维码      扫二维码      扫二维码  \n",
       "52      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  \n",
       "53      扫二维码       未上课       未上课      扫二维码      扫二维码  \n",
       "54      扫二维码      扫二维码      扫二维码      扫二维码      扫二维码  "
      ]
     },
     "execution_count": 273,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_excel(r'数据挖掘-汇总-数据表.xlsx',\n",
    "                   usecols=[7,8,10,11,13,15,17,18,19,21,22,23,24],         # 读取上课方式列\n",
    "                   skiprows=range(0,1),                     # 不读取0-3行\n",
    "                   nrows=56)                                # 读取前41列\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "id": "9a5a30aa",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "index_list = tuple(df.index)\n",
    "columns_list = tuple(df.columns)\n",
    "transactions_list = []\n",
    "list_in = []\n",
    "for index in index_list:\n",
    "    # print(index)\n",
    "    for line_value in df.loc[index]:\n",
    "        # print(line_value)\n",
    "        list_in.append(str(line_value))\n",
    "    transactions_list.append(tuple(list_in))\n",
    "    list_in = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 277,
   "id": "ece9854f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 项集： {('扫二维码',): 55, ('未上课',): 55}\n",
      "2 项集： {('扫二维码', '未上课'): 55}\n"
     ]
    }
   ],
   "source": [
    "# 频繁项集(指定min_support=0.6, min_confidence=0.7)\n",
    "itemsets_2, rules_2 = apriori(transactions_list, min_support=0.8, min_confidence=1)\n",
    "for i in itemsets_2:\n",
    "    print(i, \"项集：\", itemsets_2[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 276,
   "id": "da5ba854",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "强关联规则:\n",
      " [{未上课} -> {扫二维码}, {扫二维码} -> {未上课}]\n"
     ]
    }
   ],
   "source": [
    "print(\"强关联规则:\\n\", rules_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3f109311",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7224cb6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4719f19",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d039a0c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d570b5db",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "af33fc38",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75e7716d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a4471b64",
   "metadata": {},
   "source": [
    "## 分类:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "id": "473ebdc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import neighbors, datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "id": "885d52af",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp/ipykernel_14340/1716466298.py:23: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"备注\"][i] = \"D\"\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp/ipykernel_14340/1716466298.py:19: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"备注\"][i] = \"B\"\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp/ipykernel_14340/1716466298.py:21: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"备注\"][i] = \"C\"\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp/ipykernel_14340/1716466298.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data[\"备注\"][i] = \"A\"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [77. ,  2.7,  8.1],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [75. ,  2.5,  7.5],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [81. ,  3.1,  9.3],\n",
       "       [90. ,  4. , 12. ],\n",
       "       [87. ,  3.7, 11.1],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [93. ,  4.3, 12.9],\n",
       "       [91. ,  4.1, 12.3],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [94. ,  4.4, 13.2],\n",
       "       [88. ,  3.8, 11.4],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [70. ,  2. ,  6. ],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [79. ,  2.9,  8.7],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [88. ,  3.8, 11.4],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [95. ,  4.5, 13.5],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [87. ,  3.7, 11.1],\n",
       "       [67. ,  1.7,  5.1],\n",
       "       [90. ,  4. , 12. ],\n",
       "       [79. ,  2.9,  8.7],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [74. ,  2.4,  7.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [73. ,  2.3,  6.9],\n",
       "       [72. ,  2.2,  6.6]])"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取55学生成绩相关数据（数据挖掘成绩.xlsx）\n",
    "df_1 = pd.read_excel(r'C:\\Users\\Administrator\\Desktop\\数据挖掘\\期末综合实验任务\\数据挖掘成绩.xlsx',\n",
    "                   usecols=[i for i in range(0,7)],         # 读取0-6列\n",
    "                   skiprows=range(0,4),                     # 不读取0-3行\n",
    "                   nrows=41)                                # 读取前41列\n",
    "\n",
    "df_2 = pd.read_excel(r'C:\\Users\\Administrator\\Desktop\\数据挖掘\\期末综合实验任务\\数据挖掘成绩.xlsx',\n",
    "                   usecols=[i for i in range(0,7)],         # 读取0-6列\n",
    "                   skiprows=range(0,52),                    # 不读取0-52行\n",
    "                   nrows=14)                                # 读取前14列\n",
    "data = pd.concat([df_1, df_2], axis=0)\n",
    "data.index = range(len(data))\n",
    "data[[\"成绩\",\"绩点\",\"学分绩点\"]] = data[[\"成绩\",\"绩点\",\"学分绩点\"]].astype(float)\n",
    "\n",
    "for i in data.index:\n",
    "    if data[\"成绩\"][i] >= 90:\n",
    "        data[\"备注\"][i] = \"A\"\n",
    "    elif data[\"成绩\"][i] >= 80:\n",
    "        data[\"备注\"][i] = \"B\"\n",
    "    elif data[\"成绩\"][i] >= 70:\n",
    "        data[\"备注\"][i] = \"C\"\n",
    "    else:\n",
    "        data[\"备注\"][i] = \"D\"\n",
    "\n",
    "# # 模型预测\n",
    "x = data[[\"成绩\",\"绩点\",\"学分绩点\"]].values\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "id": "facf309b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['D', 'B', 'B', 'B', 'C', 'D', 'B', 'B', 'C', 'B', 'B', 'A', 'B',\n",
       "       'B', 'B', 'A', 'A', 'B', 'A', 'B', 'D', 'D', 'B', 'B', 'C', 'B',\n",
       "       'B', 'C', 'B', 'D', 'B', 'B', 'B', 'B', 'B', 'D', 'B', 'B', 'B',\n",
       "       'A', 'B', 'D', 'B', 'B', 'B', 'B', 'B', 'D', 'A', 'C', 'B', 'C',\n",
       "       'B', 'C', 'C'], dtype=object)"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred= data[\"备注\"].values\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "id": "d111d02a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=15, weights='distance')"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 指定近邻个数\n",
    "n_neighbors = 15\n",
    "weights = 'distance'\n",
    "knn_clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)\n",
    "knn_clf.fit(x, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "id": "4720070b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['D', 'B', 'B', 'B', 'C', 'D', 'B', 'B', 'C', 'B', 'B', 'A', 'B',\n",
       "       'B', 'B', 'A', 'A', 'B', 'A', 'B', 'D', 'D', 'B', 'B', 'C', 'B',\n",
       "       'B', 'C', 'B', 'D', 'B', 'B', 'B', 'B', 'B', 'D', 'B', 'B', 'B',\n",
       "       'A', 'B', 'D', 'B', 'B', 'B', 'B', 'B', 'D', 'A', 'C', 'B', 'C',\n",
       "       'B', 'C', 'C'], dtype=object)"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_pre_y = knn_clf.predict(x)\n",
    "knn_pre_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "id": "15a4962c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 准确率：\n",
    "sum=0\n",
    "for i in range(len(y_pred)):\n",
    "    if knn_pre_y[i] == y_pred[i]:\n",
    "        sum+=1\n",
    "sum/len(y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bc2b5d28",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3cc2942d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6329a7ec",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "94fd629d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "29e106f8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35a747ed",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5abfd863",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e27abf7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31dbac4e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66241b25",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "79f81d0a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "7d814ad1",
   "metadata": {},
   "source": [
    "## 聚类："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "ad214f0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.cluster import DBSCAN\n",
    "from sklearn import metrics\n",
    "from sklearn.datasets import make_blobs\n",
    "# from sklearn.datasets.samples_generator import make_blobs\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "2d549d68",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [77. ,  2.7,  8.1],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [75. ,  2.5,  7.5],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [81. ,  3.1,  9.3],\n",
       "       [90. ,  4. , 12. ],\n",
       "       [87. ,  3.7, 11.1],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [93. ,  4.3, 12.9],\n",
       "       [91. ,  4.1, 12.3],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [94. ,  4.4, 13.2],\n",
       "       [88. ,  3.8, 11.4],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [70. ,  2. ,  6. ],\n",
       "       [85. ,  3.5, 10.5],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [79. ,  2.9,  8.7],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [88. ,  3.8, 11.4],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [83. ,  3.3,  9.9],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [95. ,  4.5, 13.5],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [69. ,  1.9,  5.7],\n",
       "       [80. ,  3. ,  9. ],\n",
       "       [84. ,  3.4, 10.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [89. ,  3.9, 11.7],\n",
       "       [87. ,  3.7, 11.1],\n",
       "       [67. ,  1.7,  5.1],\n",
       "       [90. ,  4. , 12. ],\n",
       "       [79. ,  2.9,  8.7],\n",
       "       [86. ,  3.6, 10.8],\n",
       "       [74. ,  2.4,  7.2],\n",
       "       [82. ,  3.2,  9.6],\n",
       "       [73. ,  2.3,  6.9],\n",
       "       [72. ,  2.2,  6.6]])"
      ]
     },
     "execution_count": 254,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取55学生成绩相关数据（数据挖掘成绩.xlsx）\n",
    "df_1 = pd.read_excel(r'C:\\Users\\Administrator\\Desktop\\数据挖掘\\期末综合实验任务\\数据挖掘成绩.xlsx',\n",
    "                   usecols=[i for i in range(0,7)],         # 读取0-6列\n",
    "                   skiprows=range(0,4),                     # 不读取0-3行\n",
    "                   nrows=41)                                # 读取前41列\n",
    "\n",
    "df_2 = pd.read_excel(r'C:\\Users\\Administrator\\Desktop\\数据挖掘\\期末综合实验任务\\数据挖掘成绩.xlsx',\n",
    "                   usecols=[i for i in range(0,7)],         # 读取0-6列\n",
    "                   skiprows=range(0,52),                    # 不读取0-52行\n",
    "                   nrows=14)                                # 读取前14列\n",
    "data = pd.concat([df_1, df_2], axis=0)\n",
    "data.index = range(len(data))\n",
    "data[[\"成绩\",\"绩点\",\"学分绩点\"]] = data[[\"成绩\",\"绩点\",\"学分绩点\"]].astype(float)\n",
    "data = data[[\"成绩\",\"绩点\",\"学分绩点\"]].values\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "9081ae0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "X ,labels_trun = make_blobs(n_samples=750, centers=data, cluster_std=0.4)\n",
    "X = StandardScaler().fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "ee186e09",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算DBSCAN模型\n",
    "db = DBSCAN(eps=0.3, min_samples=10).fit(X)\n",
    "core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n",
    "core_samples_mask[db.core_sample_indices_] = True\n",
    "labels = db.labels_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "id": "f3b8781a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "估计聚类个数： 4\n"
     ]
    }
   ],
   "source": [
    "# 统计基本结果\n",
    "n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)\n",
    "print(\"估计聚类个数：\",n_clusters_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "id": "53691ce8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘图展示效果\n",
    "unique_labels = set(labels)\n",
    "colors = [plt.cm.Spectral(each)\n",
    "         for each in np.linspace(0, 1, len(unique_labels))]\n",
    "for k, col in zip(unique_labels, colors):\n",
    "    if k == -1:\n",
    "        col = [0, 0, 0, 1]\n",
    "    class_member_mask = (labels == k)\n",
    "    xy = X[class_member_mask & core_samples_mask]\n",
    "    plt.plot(xy[:, 0], xy[:, 1],\n",
    "             \"o\",\n",
    "             markerfacecolor=tuple(col),\n",
    "             markeredgecolor=\"k\",\n",
    "             markersize=14)\n",
    "    xy = X[class_member_mask & ~core_samples_mask]\n",
    "    plt.plot(xy[:, 0], xy[:, 1],\n",
    "             \"o\",\n",
    "             markerfacecolor=tuple(col),\n",
    "             markeredgecolor=\"k\",\n",
    "\n",
    "             markersize=6)\n",
    "plt.title(\"估计群集数:{}\".format(n_clusters_))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "419d06f3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
